package com.geh.learn.jvm;

import java.util.ArrayList;
import java.util.List;

/**
 *
 * Java 堆是用来存储对象实例的, 因此如果我们不断地创建对象,
 * 并且保证 GC Root 和创建的对象之间有可达路径以免对象被垃圾回收,
 * 那么当创建的对象过多时, 会导致 heap 内存不足, 进而引发 OutOfMemoryError 异常。
 * 下面是一个引发 OutOfMemoryError 异常的代码,
 * 我们可以看到, 它就是通过不断地创建对象,
 * 并将对象保存在 list 中防止其被垃圾回收,
 * 因此当对象过多时, 就会使堆内存溢出。
 *
 * 通过 java -Xms10m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError
 * 我们设置了堆内存为 10 兆,
 * 并且使用参数 -XX:+HeapDumpOnOutOfMemoryError
 * 让 JVM 在发生 OutOfMemoryError 异常时打印出当前的内存快照以便于后续分析.
 *
 * VM Args: java -Xms10m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError
 */
public class OutOfMemoryErrorTest {
    public static void main(String[] args) {
        List<Integer> list = new ArrayList<>();
        int i = 0;
        while (true) {
            list.add(i++);
        }
    }
}